package eu.catengine.primitive;

/**
 * Klasa określa rozmiary dowolnych obiektów poprzez ich szerokość i wysokość
 * (width, height).
 * 
 * @author mbienkowski
 */
public class Size
{
    /**
     * Określa wymiary obiektu.
     */
    public float width, height;

    /**
     * Konstruktor kopiujący.
     * 
     * @param size
     *            <code>Size</code> obiekt do skopiowania.
     */
    public Size(Size size)
    {
	this.width = size.width;
	this.height = size.height;
    }

    /**
     * Konstruktor tworzący rozmiar obiektu o podanej szerokości i wysokość.
     * 
     * @param width
     *            <code>float</code> szerokość.
     * @param height
     *            <code>float</code> wysokość.
     */
    public Size(float width, float height)
    {
	this.width = width;
	this.height = height;
    }

    /**
     * Do obecnych wymiarów dodaje poszczególne składowe wymiaru podanego jako
     * parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size add(Size size)
    {
	this.width += size.width;
	this.height += size.height;

	return this;
    }

    /**
     * Do obecnych wymiarów dodaje wymiary podane jako parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size add(float width, float height)
    {
	this.width += width;
	this.height += height;

	return this;
    }

    /**
     * Od obecnych wymiarów odejmuje poszczególne składowe wymiaru podanego jako
     * parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size subtract(Size size)
    {
	this.width -= size.width;
	this.height -= size.height;

	return this;
    }

    /**
     * Od obecnych wymiarów odejmuje wymiary podane jako parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size subtract(float width, float y)
    {
	this.width -= width;
	this.height -= y;

	return this;
    }

    /**
     * Mnoży obecne wymiary przez poszczególne składowe wymiaru podanego jako
     * parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size multiply(Size size)
    {
	this.width *= size.width;
	this.height *= size.height;

	return this;
    }

    /**
     * Mnoży obecne wymiary przez wymiary podane jako parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size multiply(float width, float height)
    {
	this.width *= width;
	this.height *= height;

	return this;
    }

    /**
     * Mnoży obecne wymiary przez skalar podany jako parametr.
     * 
     * @return <code>Size</code> zwraca referencję na obiekt po wykonanym
     *         działaniu.
     */
    public Size multiply(float scalar)
    {
	this.width *= scalar;
	this.height *= scalar;

	return this;
    }

    /**
     * Dzieli obecne wymiary przez poszczególne składowe wymiaru podanego jako
     * parametr.
     */
    public void divide(Size size)
    {
	this.width /= size.width;
	this.height /= size.height;
    }

    /**
     * Dzieli obecne wymiary przez wymiary podane jako parametr.
     */
    public void divide(float width, float height)
    {
	this.width /= width;
	this.height /= height;
    }

    /**
     * Dzieli obecne wymiary przez skalar podany jako parametr.
     */
    public void divide(float scalar)
    {
	this.width /= scalar;
	this.height /= scalar;
    }

    /**
     * Przypisuje wartość składowych szerokość i wysokość.
     */
    public void set(float width, float height)
    {
	this.width = width;
	this.height = height;
    }

    /**
     * Przypisuje wartość szerokości.
     */
    public void setWidth(float width)
    {
	this.width = width;
    }

    /**
     * Przypisuje wartość wysokości.
     */
    public void setHeight(float height)
    {
	this.height = height;
    }

    /**
     * Reprezentuje szerokość oraz wysokość w postaci tekstu: Size(1.0f, 1.0f).
     */
    @Override
    public String toString()
    {
	return "SizeWH(" + width + "," + height + ")";
    }

}
